﻿#region

using System;
using System.Windows.Forms;

#endregion

namespace WMAAN.Uzytki
{
    public class DetektorAktywnosciUzytkownika : IMessageFilter, IDisposable
    {
        #region Delegates

        public delegate void WykrytoAktywnoscUzytkownikaHandler(
            object sender, WykrytoAktywnoscUzytkownikaHandlerArgs args);

        #endregion

        public DetektorAktywnosciUzytkownika()
        {
            OstatniaAktywnosc = DateTime.Now;
            Application.AddMessageFilter(this);
        }

        public DateTime OstatniaAktywnosc { get; private set; }

        #region IDisposable Members

        public void Dispose()
        {
            Application.RemoveMessageFilter(this);
        }

        #endregion

        #region IMessageFilter Members

        public bool PreFilterMessage(ref Message m)
        {
            switch ((Win32Message) m.Msg)
            {
                case Win32Message.WM_KEYUP:
                case Win32Message.WM_KEYDOWN:
                case Win32Message.WM_LBUTTONDOWN:
                case Win32Message.WM_LBUTTONUP:
                case Win32Message.WM_MBUTTONDOWN:
                case Win32Message.WM_MBUTTONUP:
                case Win32Message.WM_RBUTTONDOWN:
                case Win32Message.WM_RBUTTONUP:
                case Win32Message.WM_MOUSEMOVE:
                case Win32Message.WM_MOUSEWHEEL:
                    OstatniaAktywnosc = DateTime.Now;
                    OnWykrytoAktywnoscUzytkownika(new WykrytoAktywnoscUzytkownikaHandlerArgs(OstatniaAktywnosc));
                    break;
            }
            return false;
        }

        #endregion

        public event WykrytoAktywnoscUzytkownikaHandler WykrytoAktywnoscUzytkownika;

        public void OnWykrytoAktywnoscUzytkownika(WykrytoAktywnoscUzytkownikaHandlerArgs args)
        {
            WykrytoAktywnoscUzytkownikaHandler handler = WykrytoAktywnoscUzytkownika;
            if (handler != null) handler(this, args);
        }

        #region Nested type: Win32Message

        private enum Win32Message
        {
            WM_KEYFIRST = 0x100,
            WM_KEYDOWN = 0x100,
            WM_KEYUP = 0x101,
            WM_CHAR = 0x102,
            WM_DEADCHAR = 0x103,
            WM_SYSKEYDOWN = 0x104,
            WM_SYSKEYUP = 0x105,
            WM_SYSCHAR = 0x106,
            WM_SYSDEADCHAR = 0x107,

            WM_MOUSEFIRST = 0x200,
            WM_MOUSEMOVE = 0x200,
            WM_LBUTTONDOWN = 0x201,
            WM_LBUTTONUP = 0x202,
            WM_LBUTTONDBLCLK = 0x203,
            WM_RBUTTONDOWN = 0x204,
            WM_RBUTTONUP = 0x205,
            WM_RBUTTONDBLCLK = 0x206,
            WM_MBUTTONDOWN = 0x207,
            WM_MBUTTONUP = 0x208,
            WM_MBUTTONDBLCLK = 0x209,
            WM_MOUSEWHEEL = 0x20A
        }

        #endregion

        #region Nested type: WykrytoAktywnoscUzytkownikaHandlerArgs

        public class WykrytoAktywnoscUzytkownikaHandlerArgs
        {
            public WykrytoAktywnoscUzytkownikaHandlerArgs(DateTime ostatniaWykrytoAktywnoscUzytkownika)
            {
                OstatniaWykrytoAktywnoscUzytkownika = ostatniaWykrytoAktywnoscUzytkownika;
            }

            public DateTime OstatniaWykrytoAktywnoscUzytkownika { get; private set; }
        }

        #endregion
    }
}